/*
 * Copyright 2012 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.android.apps.mytracks.services.sensors.ant;

import com.google.android.maps.mytracks.R;

/**
 * Combined cadence, speed, torque and power bike sensor channel configuration.
 * 
 * @author Chet Henry
 * adapted from CombinedBikeChannelConfiguration.java - Jimmy Shih
 */
public class PowerChannelConfiguration extends ChannelConfiguration {
  private static final int DEVICE_ID_KEY = R.string.ant_power_sensor_id_key;
  private static final byte DEVICE_TYPE = (byte) 11;
  private static final short MESSAGE_PERIOD = 8182;

  private PowerCounter powerCounter = new PowerCounter();

  @Override
  public int getDeviceIdKey() {
    return DEVICE_ID_KEY;
  }

  @Override
  public byte getDeviceType() {
    return DEVICE_TYPE;
  }

  @Override
  public short getMessagPeriod() {
    return MESSAGE_PERIOD;
  }

  @Override
  public void decodeMessage(byte[] message, AntSensorValue antSensorValue) {
    
    if (message[3] == 16) {
      int watt = (short) (((message[10] & 0xff) << 8) | (message[9] & 0xff));
      int rpm = (byte) (message[6] & 0xFF);
      
      powerCounter.processMessage(watt, rpm);
    }
    else if (message[3] == 17) {
      //4  = Update Event Counter
      //5  = Wheel Ticks
      //6  = Instantaneous Cadence
      //7  = Wheel Period LSB
      //8  = Wheel Period MSB
      //9  = Accumulated Torque LSB
      //10 = Accumulated Torque LSB
      
      int eventCount = message[4] & 0xff;
      int revCount = message[5] & 0xff;
      int rpm = message[6] & 0xff;
      int wheel_period = (char) ((message[8] << 8) | (message[7] & 0xff));
      int torque = (char) ((message[10] << 8) | (message[9] & 0xff));
      
      powerCounter.processMessageWithTorque(eventCount, revCount, rpm, wheel_period, torque);
    }
    
    antSensorValue.setPower(powerCounter.getPower());
    antSensorValue.setSpeed(powerCounter.getSpeed());
    antSensorValue.setCadence(powerCounter.getCadence());
    antSensorValue.setTorque(powerCounter.getTorque());
  }
}
